package decorator

import (
	"fmt"
)

//动态的给对象赋予一些其他功能
//传入一个方法，再方法前后执行一些其他的东西，返回一个新的方法。
func Decorate(f func(s string)) func(s string) {
	return func(s string) {
		fmt.Println("Started")
		if s == "1" {
			s = "x"
		}
		f(s)
		fmt.Println("Done")
	}
}

type Func func(s string)

type Person struct {
	Name string
	f    Func
}

func (m *Person) Decorate(f Func) Func {
	return func(s string) {
		fmt.Println("Welcome " + m.Name + " Zone")
		f(s)
	}
}

type Animal struct {
	Name string
}

func (m *Animal) Decorate(f Func) Func {
	return func(s string) {
		fmt.Println("Hi " + m.Name + " Zone")
		f(s)
	}
}

type Decorator interface {
	Decorate(Func) Func
}

func Decor(decorator Decorator, f Func) Func {
	f = decorator.Decorate(f)
	return f
}
